"""
AI提示词配置文件
包含各种AI任务的提示词模板，保持格式化和可维护性
支持从环境变量或配置文件中读取自定义提示词
"""

from .config import settings

# 默认系统角色提示词
DEFAULT_SYSTEM_PROMPT = """你是一个专业的需求分析师和测试专家，擅长分析需求文档并生成高质量的测试用例。"""

# 默认需求分析提示词模板
DEFAULT_REQUIREMENT_ANALYSIS_PROMPT = """请分析以下需求文档，识别其中的模糊点、潜在风险和改进建议：

需求文档内容：
{requirement_text}

请从以下几个方面进行分析：

1. **需求模糊点分析**
   - 指出需求描述不够清晰的地方
   - 标识可能存在歧义的表述
   - 列出需要进一步确认的细节

2. **潜在风险识别**
   - 技术实现风险
   - 业务逻辑风险
   - 用户体验风险
   - 性能和安全风险

3. **改进建议**
   - 针对模糊点提出具体的改进建议
   - 风险规避和缓解措施
   - 需求补充和完善建议

4. **优先级建议**
   - 核心功能识别
   - 功能优先级排序建议

请用中文回复，格式清晰，条理分明。"""

# 默认测试用例生成提示词模板
DEFAULT_TEST_CASE_GENERATION_PROMPT = """# 角色
假如你是一位资深测试用例设计专家，拥有10年以上软件测试经验，精通各类测试用例设计方法论，你将根据客户提出的具体软件需求，严格遵循以下规则系统性地设计全面、详尽的测试用例，确保覆盖软件功能的所有场景与潜在风险。

# 任务描述与要求
1. **测试方法强制要求**：必须综合运用等价类划分法（明确有效/无效等价类）、边界值分析法（覆盖上下边界及临界值）、判定表法（梳理条件与动作关系）、因果图法（分析输入条件组合与结果）、正交测试法（通过正交表覆盖多因素组合）、错误推测法（基于经验预判高频错误场景）、场景法（模拟用户实际操作流程）共7类测试方法，根据这几类方法设计出测试用例。
2. **测试用例组成要素**：每个测试用例必须包含以下6个核心要素，缺一不可：
   - **模块**：明确归属的软件功能模块（如“用户管理模块”“支付流程模块”）；
   - **测试用例名称加编号**：格式为“[需求名称]-[编号]-[测试用例名称]”，编号需全局持续递增（如“用户登录_001_正常账号密码登录”“用户登录_002_密码为空登录”）；
   - **前置条件**：列出执行用例前需满足的所有环境、数据、状态条件，多条件用“；”分隔（如“系统已部署并正常运行；数据库中存在测试账号test01；用户未登录系统”）；
   - **测试步骤**：按操作顺序编写详细步骤，每个步骤需描述具体操作动作（如“1. 打开浏览器，输入系统URL并回车；2. 在用户名输入框输入‘test01’；3. 在密码输入框输入‘123456’；4. 点击‘登录’按钮”）；
   - **预期结果**：与测试步骤编号一一对应，每个步骤的预期结果需包含界面反馈、数据状态、系统行为等，多结果用“；”连接（如“1. 浏览器显示系统登录页面；2. 用户名输入框正确显示‘test01’；3. 密码输入框显示为加密字符（如‘••••••’）；4. 页面跳转至系统首页；URL变更为‘/home’；数据库用户表中‘last_login_time’字段更新为当前时间”）。
3. **格式规范**：严格遵循以下Markdown格式（需支持导入XMind），标题层级、缩进、编号规则与示例完全一致：
   - 一级标题：`# [用例集名称]`（如“# 用户登录功能测试用例集”）；
   - 二级标题：`## [模块名称]`（如“## 用户登录模块”）；
   - 三级标题：`### [测试用例名称加编号]`（如“### 用户登录_001_正常账号密码登录”）；
   - 前置条件：`- 前置条件:` 后接具体条件，缩进1个Tab，多条件用“；”分隔；
   - 测试步骤与预期结果：步骤以“- 1. ”开头，预期结果缩进1个Tab，以“- 1. ”开头，编号与步骤严格对应（如步骤1对应预期结果1，步骤2对应预期结果2）。
4. **详尽性要求**：禁止简化或合并测试步骤/预期结果，需细化至原子操作（如区分“输入字符”“点击按钮”“等待响应”等独立动作），预期结果需覆盖界面、数据、日志等多维度验证点（如界面元素显示、数据库数据变化、接口返回值、日志输出等），不得因为上下文长度限制用例数量，不得省略和遗漏。
5. **编号规则**：测试用例编号需全局唯一且持续递增，不受模块或方法分类影响（如模块A的用例编号为001、002，模块B的用例编号续接为003、004，以此类推）。

#参考示例
示例 1：
用户：请基于"用户登录功能"设计测试用例，需求：用户通过账号密码登录系统，账号为6-12位字母/数字组合，密码为8-20位包含大小写字母+数字+特殊符号的组合，支持"记住密码"功能
输出：
# 用户登录功能测试用例集

## 用户登录模块

### 用户登录_001_正常账号密码登录
- 前置条件: 系统已部署并正常运行；数据库中存在账号“test01”（密码“Test@123”）；用户未登录系统；浏览器Cookie为空
    - 1. 打开Chrome浏览器，输入系统登录URL“http://testsystem.com/login”并回车
        - 1. 浏览器页面加载完成；显示登录界面，包含“用户名”输入框、“密码”输入框、“记住密码”复选框、“登录”按钮；页面标题为“系统登录”
    - 2. 在用户名输入框中输入“test01”
        - 2. 输入框内显示“test01”；光标定位在输入框末尾
    - 3. 在密码输入框中输入“Test@123”
        - 3. 输入框内显示加密字符“•••••••”（共8位）；光标定位在输入框末尾
    - 4. 点击“登录”按钮
        - 4. 页面跳转至系统首页“http://testsystem.com/home”；页面顶部显示用户名“test01”；数据库用户表中“last_login_time”字段更新为当前系统时间；服务端日志输出“用户test01登录成功”

### 用户登录_002_密码为空登录
- 前置条件: 系统已部署并正常运行；数据库中存在账号“test01”；用户未登录系统
    - 1. 打开浏览器，访问登录页面；在用户名输入框输入“test01”；密码输入框保持为空
        - 1. 用户名输入框显示“test01”；密码输入框为空
    - 2. 点击“登录”按钮
        - 2. 系统弹出错误提示框，内容为“密码不能为空，请输入密码”；提示框位于页面中央；登录按钮变为不可点击状态（禁用5秒）；服务端日志输出“用户test01登录失败：密码为空”

示例 2：
用户：请基于"购物车结算功能"设计测试用例，重点覆盖边界值与场景法
输出：
# 购物车结算功能测试用例集

## 购物车结算模块

### 购物车结算_001_商品数量为1结算
- 前置条件: 用户已登录系统；购物车中存在商品A（单价199元，库存10件）；商品A数量为1件；用户收货地址已设置并默认
    - 1. 点击“购物车”图标进入购物车页面；确认商品A数量为1件；点击“去结算”按钮
        - 1. 页面跳转至结算页面；商品列表显示商品A，数量1件，单价199元；小计金额显示“199.00元”；页面顶部显示“结算-共1件商品”
    - 2. 核对收货地址为默认地址；点击“提交订单”按钮
        - 2. 系统生成订单号（格式为“ORD20250729XXXX”）；页面跳转至支付页面；订单状态更新为“待支付”；购物车中商品A数量减少1件（变为0件后自动移除）；数据库订单表新增订单记录，包含商品A信息、数量1、总金额199元

### 购物车结算_002_商品数量达库存上限结算
- 前置条件: 用户已登录系统；购物车中存在商品B（单价299元，库存5件）；用户手动将商品B数量修改为5件；收货地址已设置
    - 1. 进入购物车页面；确认商品B数量为5件（库存上限）；点击“去结算”
        - 1. 结算页面显示商品B数量5件，小计金额“1495.00元”；系统提示“当前商品数量已达库存上限，下单后将锁定库存15分钟”
    - 2. 提交订单并完成支付
        - 2. 订单创建成功；商品B库存减少5件（更新为0）；系统向用户发送订单确认短信；商家后台显示新订单通知

### 购物车结算_003_断网场景下结算
- 前置条件: 用户已登录；购物车有商品C（数量2件）；网络连接正常；结算页面已加载完成
    - 1. 在结算页面断开网络连接（禁用WiFi/数据流量）；点击“提交订单”按钮
        - 1. 页面显示“网络连接失败，请检查网络后重试”提示；按钮变为“重试”；订单未创建
    - 2. 重新连接网络；点击“重试”按钮
        - 2. 系统重新提交订单；订单创建成功；页面跳转至支付页面；网络恢复后未重复创建订单（避免重复下单）

# 现在请基于以下需求设计测试用例：
{requirement_text}

请严格按照上述规则和格式输出测试用例。"""

# 默认代码审查提示词模板
DEFAULT_CODE_REVIEW_PROMPT = """请对以下代码进行专业的代码审查：

代码内容：
{code_content}

请从以下方面进行审查：

1. **代码质量**
   - 代码结构和组织
   - 命名规范
   - 注释完整性

2. **安全性**
   - 潜在的安全漏洞
   - 输入验证
   - 权限控制

3. **性能**
   - 性能瓶颈
   - 资源使用
   - 算法效率

4. **可维护性**
   - 代码复用性
   - 模块化程度
   - 测试覆盖率

请用中文回复，提供具体的改进建议。"""

# 默认接口文档生成提示词模板
DEFAULT_API_DOCUMENTATION_PROMPT = """请为以下API接口生成详细的文档：

接口信息：
{api_info}

请生成包含以下内容的API文档：

1. **接口概述**
   - 接口功能描述
   - 适用场景

2. **请求信息**
   - 请求方法
   - 请求URL
   - 请求头
   - 请求参数

3. **响应信息**
   - 响应格式
   - 响应参数
   - 状态码说明

4. **示例**
   - 请求示例
   - 响应示例
   - 错误示例

请用中文回复，格式清晰，便于开发者理解和使用。"""

def get_system_prompt() -> str:
    """获取系统角色提示词，优先使用自定义配置"""
    return settings.CUSTOM_SYSTEM_PROMPT or DEFAULT_SYSTEM_PROMPT

def get_requirement_analysis_prompt() -> str:
    """获取需求分析提示词模板，优先使用自定义配置"""
    return settings.CUSTOM_REQUIREMENT_ANALYSIS_PROMPT or DEFAULT_REQUIREMENT_ANALYSIS_PROMPT

def get_test_case_generation_prompt() -> str:
    """获取测试用例生成提示词模板，优先使用自定义配置"""
    return settings.CUSTOM_TEST_CASE_GENERATION_PROMPT or DEFAULT_TEST_CASE_GENERATION_PROMPT

def get_code_review_prompt() -> str:
    """获取代码审查提示词模板，优先使用自定义配置"""
    return settings.CUSTOM_CODE_REVIEW_PROMPT or DEFAULT_CODE_REVIEW_PROMPT

def get_api_documentation_prompt() -> str:
    """获取API文档生成提示词模板，优先使用自定义配置"""
    return settings.CUSTOM_API_DOCUMENTATION_PROMPT or DEFAULT_API_DOCUMENTATION_PROMPT

# 提示词配置映射
PROMPT_TEMPLATES = {
    "requirement_analysis": get_requirement_analysis_prompt,
    "test_case_generation": get_test_case_generation_prompt,
    "code_review": get_code_review_prompt,
    "api_documentation": get_api_documentation_prompt,
}

def get_prompt(prompt_type: str, **kwargs) -> str:
    """
    获取格式化的提示词
    
    Args:
        prompt_type: 提示词类型
        **kwargs: 格式化参数
        
    Returns:
        格式化后的提示词
    """
    if prompt_type not in PROMPT_TEMPLATES:
        raise ValueError(f"未知的提示词类型: {prompt_type}")
    
    # 获取提示词模板函数
    template_func = PROMPT_TEMPLATES[prompt_type]
    prompt_template = template_func()
    
    try:
        return prompt_template.format(**kwargs)
    except KeyError as e:
        raise ValueError(f"提示词格式化失败，缺少参数: {e}")

def list_available_prompts() -> dict:
    """列出所有可用的提示词类型及其描述"""
    return {
        "requirement_analysis": "需求分析提示词",
        "test_case_generation": "测试用例生成提示词",
        "code_review": "代码审查提示词",
        "api_documentation": "API文档生成提示词",
    }

def get_prompt_preview(prompt_type: str) -> str:
    """获取提示词预览（不进行格式化）"""
    if prompt_type not in PROMPT_TEMPLATES:
        raise ValueError(f"未知的提示词类型: {prompt_type}")
    
    template_func = PROMPT_TEMPLATES[prompt_type]
    return template_func() 